const a = function _(echarts, { data }, { xe: { pluck } }) {
  function getParametricEquation(
    startRatio,
    endRatio,
    isSelected,
    isHovered,
    k,
    h
  ) {
    let midRatio = (startRatio + endRatio) / 2;
    let startRadian = startRatio * Math.PI * 2;
    let endRadian = endRatio * Math.PI * 2;
    let midRadian = midRatio * Math.PI * 2;
    if (startRatio === 0 && endRatio === 1) {
      isSelected = false;
    }
    k = typeof k !== "undefined" ? k : 1 / 3;
    let offsetX = isSelected ? Math.cos(midRadian) * 0.1 : 0;
    let offsetY = isSelected ? Math.sin(midRadian) * 0.1 : 0;
    let hoverRate = isHovered ? 1.05 : 1;
    return {
      u: { min: -Math.PI, max: Math.PI * 3, step: Math.PI / 32 },
      v: { min: 0, max: Math.PI * 2, step: Math.PI / 20 },
      x: function (u, v) {
        if (u < startRadian) {
          return (
            offsetX + Math.cos(startRadian) * (1 + Math.cos(v) * k) * hoverRate
          );
        }
        if (u > endRadian) {
          return (
            offsetX + Math.cos(endRadian) * (1 + Math.cos(v) * k) * hoverRate
          );
        }
        return offsetX + Math.cos(u) * (1 + Math.cos(v) * k) * hoverRate;
      },
      y: function (u, v) {
        if (u < startRadian) {
          return (
            offsetY + Math.sin(startRadian) * (1 + Math.cos(v) * k) * hoverRate
          );
        }
        if (u > endRadian) {
          return (
            offsetY + Math.sin(endRadian) * (1 + Math.cos(v) * k) * hoverRate
          );
        }
        return offsetY + Math.sin(u) * (1 + Math.cos(v) * k) * hoverRate;
      },
      z: function (u, v) {
        if (u < -Math.PI * 0.5) {
          return Math.sin(u);
        }
        if (u > Math.PI * 2.5) {
          return Math.sin(u) * h * 0.1;
        }
        return Math.sin(v) > 0 ? 1 * h * 0.1 : -1;
      },
    };
  }
  function getPie3D(pieData, internalDiameterRatio) {
    let series = [];
    let sumValue = 0;
    let startValue = 0;
    let endValue = 0;
    let legendData = [];
    let k =
      typeof internalDiameterRatio !== "undefined"
        ? (1 - internalDiameterRatio) / (1 + internalDiameterRatio)
        : 1 / 3;
    for (let i = 0; i < pieData.length; i++) {
      sumValue += pieData[i].value;
      let seriesItem = {
        name:
          typeof pieData[i].name === "undefined"
            ? `series${i}`
            : pieData[i].name,
        type: "surface",
        parametric: true,
        wireframe: { show: false },
        pieData: pieData[i],
        pieStatus: { selected: false, hovered: false, k: k },
      };
      if (typeof pieData[i].itemStyle != "undefined") {
        let itemStyle = {};
        typeof pieData[i].itemStyle.color != "undefined"
          ? (itemStyle.color = pieData[i].itemStyle.color)
          : null;
        typeof pieData[i].itemStyle.opacity != "undefined"
          ? (itemStyle.opacity = pieData[i].itemStyle.opacity)
          : null;
        seriesItem.itemStyle = itemStyle;
      }
      series.push(seriesItem);
    }
    let linesSeries = [];
    for (let i = 0; i < series.length; i++) {
      endValue = startValue + series[i].pieData.value;
      series[i].pieData.startRatio = startValue / sumValue;
      series[i].pieData.endRatio = endValue / sumValue;
      series[i].parametricEquation = getParametricEquation(
        series[i].pieData.startRatio,
        series[i].pieData.endRatio,
        false,
        false,
        k,
        series[i].pieData.value
      );
      startValue = endValue;
      let midRadian =
        (series[i].pieData.endRatio + series[i].pieData.startRatio) * Math.PI;
      let posX = Math.cos(midRadian) * (1 + Math.cos(Math.PI / 2));
      let posY = Math.sin(midRadian) * (1 + Math.cos(Math.PI / 2));
      let posZ = Math.log(Math.abs(series[i].pieData.value + 1)) * 0.1;
      let flag =
        (midRadian >= 0 && midRadian <= Math.PI / 2) ||
        (midRadian >= (3 * Math.PI) / 2 && midRadian <= Math.PI * 2)
          ? 1
          : -1;
      let color = pieData[i].itemStyle.color;
      let endPosArr = [
        posX * 1.8 + i * 0.1 * flag + (flag < 0 ? -0.5 : 0),
        posY * 1.8 + i * 0.1 * flag + (flag < 0 ? -0.5 : 0),
        posZ * 2,
      ];
      linesSeries.push(
        {
          type: "line3D",
          lineStyle: { color: color },
          data: [[posX, posY, posZ], endPosArr],
        },
        {
          type: "scatter3D",
          label: {
            show: true,
            textStyle: { color: "black", backgroundColor: "transparent" },
            formatter: "{b}",
          },
          symbolSize: 0,
          data: [
            {
              name: series[i].name + "\\n" + series[i].pieData.value,
              value: endPosArr,
            },
          ],
        }
      );
      legendData.push(series[i].name);
    }
    series.push({
      name: "mouseoutSeries",
      type: "surface",
      parametric: true,
      wireframe: { show: false },
      itemStyle: { opacity: 0 },
      parametricEquation: {
        u: { min: 0, max: Math.PI * 2, step: Math.PI / 20 },
        v: { min: 0, max: Math.PI, step: Math.PI / 20 },
        x: function (u, v) {
          return Math.sin(v) * Math.sin(u) + Math.sin(u);
        },
        y: function (u, v) {
          return Math.sin(v) * Math.cos(u) + Math.cos(u);
        },
        z: function (u, v) {
          return Math.cos(v) > 0 ? 0.1 : -0.1;
        },
      },
    });
    let option = {
      legend: { data: legendData, show: false },
      tooltip: {
        formatter: (params) => {
          if (params.seriesName !== "mouseoutSeries") {
            return `${
              params.seriesName
            }<br/><span style='display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:${
              params.color
            };'></span>${option.series[params.seriesIndex].pieData.value}`;
          }
        },
      },
      xAxis3D: { min: -1, max: 1 },
      yAxis3D: { min: -1, max: 1 },
      zAxis3D: { min: -1, max: 1 },
      grid3D: {
        show: false,
        boxHeight: 10,
        top: "10%",
        viewControl: { distance: 140, alpha: 30, beta: 40, autoRotate: false },
        postEffect: {
          enable: true,
          bloom: { enable: true, bloomIntensity: 0.1 },
          SSAO: { enable: true, quality: "medium", radius: 2 },
        },
      },
      series: series,
    };
    return option;
  }
  return getPie3D(
    [
      { name: "cc", value: 37, itemStyle: { color: "#f77b66" } },
      { name: "aa", value: 54, itemStyle: { color: "#3edce0" } },
      { name: "bb", value: 32, itemStyle: { color: "#f94e76" } },
      { name: "ee", value: 16, itemStyle: { color: "#018ef1" } },
      { name: "dd", value: 13, itemStyle: { color: "#9e60f9" } },
    ],
    0.79
  );
};